package com.quanyan.club.service;

import com.quanyan.api.APIResponse;
import com.quanyan.club.entity.db.TbClubMember;
import com.quanyan.club.entity.vo.req.ReqClubMemberEditAll;
import com.quanyan.club.entity.RespClubMember;

import java.util.List;

/**
 * Created by zhuo.shi on 2016/6/1.
 */
public interface ClubMemberService {

    /**
     * 俱乐部管理员列表（包含主席、管理员、财务管理员）
     * @param clubId        俱乐部ID
     * @return
     */
    List<RespClubMember> listClubAdministors(Integer uid, Integer clubId);

    /**
     * 俱乐部所有成员列表
     * @param clubId        俱乐部ID
     * @param showFund      是否返回俱乐部成员在俱乐部中的资金
     * @param pageNo        页码
     * @param pageSize      每页记录条数
     * @return
     */
    List<RespClubMember> listClubMembers(Integer uid, Integer clubId, Boolean showFund,  Boolean showAdmin, Integer pageNo, Integer pageSize);

    /**
     * 俱乐部所有成员人数
     * @param clubId        俱乐部ID
     * @return
     */
    Integer countClubMembers(Integer clubId,  Boolean showAdmin);

    /**
     * 俱乐部代表队成员列表
     * @param clubId        俱乐部ID
     * @param pageNo        页码
     * @param pageSize      每页记录条数
     * @return
     */
    List<RespClubMember> listClubTeamMembers(Integer uid, Integer clubId, Integer pageNo, Integer pageSize);

    /**
     * 俱乐部代表队成员人数
     * @param clubId        俱乐部ID
     * @return
     */
    Integer countClubTeamMembers(Integer clubId);

    /**
     * 是否是俱乐部成员
     * @param uid       用户ID
     * @param clubId    俱乐部ID
     * @return
     */
    Boolean isClubMember(Integer uid, Integer clubId);

    Boolean isClubAdminMember(Integer uid, Integer clubId);

    Boolean isClubMasterMember(Integer uid, Integer clubId);

    /**
     * 用户申请加入某个俱乐部
     * @param uid           申请用户的ID
     * @param clubId        俱乐部ID
     * @param remark        申请人留言
     * @return              是否申请成功
     */
    Boolean applyJoinClub(Integer uid, Integer clubId, String remark, int larkAppId);

    Boolean isApplyJoinClub(Integer uid, Integer clubId, Integer inviteUid );

    /**
     * 两种情况：
     * 1. 俱乐部的管理员同意申请加入俱乐部的用户
     * 2. 被邀请的用户同意加入俱乐部
     * @param uid           申请或被邀请的用户ID
     * @param clubId        俱乐部ID
     * @return
     */
    Boolean agreeJoinClub(Integer uid, Integer clubId, Integer type, int larkAppId);

    Boolean disagreeJoinClub(Integer type, Integer uid, Integer clubId, int larkAppId);

    /**
     * 被管理员提出俱乐部，在tb_club_member中is_delete字段改为1，此成员在俱乐部中的账户任然保留
     * @param clubId        俱乐部ID
     * @param uid           被踢的用户id
     * @return
     */
    Boolean fuckoutClub(Integer clubId,Integer uid,Integer currentUid, int larkAppId);

    /**
     * 退出俱乐部
     * @param uid           要退出俱乐部的用户ID
     * @param clubId        俱乐部ID
     * @return              是否退出成功
     */
    Boolean quitClub(Integer uid, Integer clubId, int larkAppId);

    /**
     * 获取俱乐部成员加入俱乐部的状态
     * @return
     */
    int getJoinClubStatus(int clubId, int uid);

    /**
     *  俱乐主席编辑管理俱乐部成员的职位，标签
     * @param uid           被编辑的用户ID
     * @param editType      编辑类型：1为职位权限变更，2为俱乐部成员标签变更，3为俱乐部代表队成员标签变更
     * @param clubId        俱乐部ID
     * @param roleCode      俱乐部角色编码（在权限管理模块后台配置）
     * @param roleName      俱乐部角色名称
     * @param label         普通成员或代表队成员标签
     * @return              是否编辑成功
     */
    Boolean updateClubMember(Integer uid, Integer editType, Integer clubId,
                           String roleCode, String roleName, String label);

    /**
     * 俱乐部管理员邀请用户加入俱乐部
     * @param uids          邀请的用户ID，多个用户以英文逗号隔开
     * @param adminUid      俱乐部管理员（邀请人）ID
     * @param clubId        俱乐部ID
     * @return              是否邀请成功
     */
    Boolean inviteClubMember(String uids, Integer adminUid, Integer clubId, Integer type);

    void initClubMemberAccount(int clubId, int uid);

    /**
     * 搜索俱乐部成员
     * @param clubId        俱乐部id
     * @param nickName      俱乐部成员昵称
     * @return
     */
    List<RespClubMember> searchClubMember(Integer clubId, String nickName, boolean showFund);

    /**
     * 添加俱乐部代表队成员
     * @param clubId        俱乐部ID
     * @param uids          俱乐部成员id，多个俱乐部成员用,隔开
     * @return
     */
    APIResponse addClubTeamMember(Integer clubId, List<Integer> uids);

    /**
     *
     * @param clubId        俱乐部ID
     * @param uids          俱乐部成员id，多个俱乐部成员用,隔开
     * @return
     */
    Boolean cutClubTeamMember(Integer clubId, List<Integer> uids);

    /**
     * 添加俱乐部成员到搜索引擎
     * @param clubId    俱乐部id
     * @param uid       俱乐部成员uid
     */
    //void insertClubMemberIndex(int clubId, int uid);

    /**
     * 判断一个用户是否可以加入某个俱乐部的代表队
     * @param uid
     * @param clubId
     * @return
     */
    boolean canJoinClubTeam(int uid, int clubId);

    TbClubMember queryClubMember(int uid, int clubId);

    /**
     * 编辑俱乐部成员
     * @version 2.1.1
     */
    void editClubMemberAll(Integer currentUid, ReqClubMemberEditAll editAll);

    void updateClubMemberIndex(int uid);

    void updateMemberIndexOfClub(int clubId);
}
